package com.magicalcoder.lowcode.service.apiopen.service;

import com.magicalcoder.lowcode.service.apiopen.dto.McPageData;
import com.magicalcoder.lowcode.service.apiopen.dto.McQuery;

import javax.servlet.http.HttpServletRequest;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

public interface MagicalApiOpenService {
    //get 自动搜索主键 并且查询
    <T> T get(T entity);
    //insert
    <T> void persist(T entity);
    //update
    <T> T merge(T entity);
    //delete
    <T> void remove(T entity);
    //批量保存实体 自动根据主键合并
    <T> void batchSave(List<T> entityList);

    /**
     * 查询集合
     * @param clazz
     * @param mcQuery
     * @param <T>
     * @return
     */
    <T> List<T> queryList(Class<T> clazz, McQuery mcQuery);

    /**
     * 查询分页
     * @param clazz
     * @param mcQuery
     * @return
     */
    <T> McPageData<T> queryPageData(Class<T> clazz, McQuery mcQuery);

    Class scannerClass(String catalog, String schema, String tableName);

    ConcurrentHashMap<String,Class> concurrentHashMap();
    //实体类主键@Id类型
    Object translateId(Class clazz, Object id);
    //获取实体主键值
    <T>Object pkValue(T entity);
    //根据主键构造一个实体
    <T>T buildEntity(Class<T> clazz, Object id);

    /**
     * 转换一波参数 因为map到类的转换 不一定准确 会导致参数类型不对
     * @param param
     * @param clazz
     * @param request 为null则不取用户ID
     * @param <T>
     * @return
     */
    Map<String,Object> translateReqParam(Map<String, Object> param, Class clazz, HttpServletRequest request);
    /**
     * 转成McQuery
     * @param request
     * @param clazz
     * @param req
     * @param page
     * @param limit
     * @return
     */
    McQuery toMcQuery(HttpServletRequest request, Class clazz, Map<String, Object> req, Integer page, Integer limit);
    /**
     * 执行SQL语句
     * 注意这个方法的执行 会破坏原有事务 导致不回滚 慎用
     * @param sql
     * @return
     */
    void executeSql(String sql);

    String pkName(String catalog, String schema, String tableName);
    String pkName(Class clazz);

    Map<String,Object> removeParentChildren(Map<String, Object> parent);
    Map<String,Object> saveParentChildren(Map<String, Object> parent);
}
